const { Component } = React;

export default class PureComponent extends Component {
  //memo对比当前和下一个引用是否是一致的
  //shouldComponentUpdate默认返回布尔值
  shouldComponentUpdate(nextProps, nextState){
    return !shallowEqual(this.props, nextProps) || 
      !shallowEqual(this.state, nextState);
  }
}

//比对函数
function shallowEqual(o1, o2){
  if(o1 === o2){
    return true;
  }

  if(
    typeof o1 !== 'object' || 
    o1 === null || 
    typeof o2 !== 'object' || 
    o2 === null
  ){
    return false;
  }

  const k1 = Object.keys(o1);
  const k2 = Object.keys(o2);

  if(k1.length !== k2.length){
    return false;
  }

  for(let k of k1){
    if(!o2.hasOwnProperty(k) || o1[k] !== o2[k]){
      return false;
    }
  }

  //除了以上情况，两引用是全等的。
  return true;
}